﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BackEndSystemWebTv.CC;
using BackEndSystemWebTv.Enums;
using System.Web.Security;
using System.Net.Mail;
using System.Threading;

namespace BackEndSystemWebTv.Controls
{
    public partial class GebruikersBeheer : System.Web.UI.UserControl
    {
        private static CCGebruikersBeheer beheer;
        private static List<ESocialMedium> socialeMedia;
        private static CCAutorisatie autorisatie;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                beheer = new CCGebruikersBeheer();
                Updategebruikers();
                laadRollen();
                checkHuidigeGebruiker();
                checkUitgeschakeld();
            }
        }

        /// <summary>
        /// Wanneer control voor het eerst geladen wordt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void Page_Init(object sender, EventArgs e)
        {
        }

        /// <summary>
        /// Zet sociale media in een list en geeft deze terug
        /// </summary>
        /// <returns></returns>
        private List<ESocialMedium> SelecteerSocialeMedia()
        {
            socialeMedia = new List<ESocialMedium>();
            if (checkCL())
            {
                foreach (ListItem s in cblSocialM.Items)
                {
                    if (s.Selected)
                    {
                        switch (s.Text)
                        {
                            case "Facebook":
                                socialeMedia.Add(ESocialMedium.Facebook);
                                break;
                            case "Twitter":
                                socialeMedia.Add(ESocialMedium.Twitter);
                                break;
                            case "WindowsLiveMessenger":
                                socialeMedia.Add(ESocialMedium.WindowsLiveMessenger);
                                break;
                            case "Gmail":
                                socialeMedia.Add(ESocialMedium.Gmail);
                                break;
                            case "Youtube":
                                socialeMedia.Add(ESocialMedium.Youtube);
                                break;
                            default:
                                break;
                        }
                    }
                }
            }
            return socialeMedia;
        }

        /// <summary>
        /// Kijkt welke sociale media geselecteerd zijn
        /// </summary>
        /// <returns></returns>
        private bool checkCL()
        {
            for (int i = 0; i < cblSocialM.Items.Count; i++)
            {
                if (cblSocialM.Items[i].Selected)
                    return true;
            }
            return false;
        }

        /// <summary>
        /// Vult dropdown list met bestaande gebruikers
        /// </summary>
        public void Updategebruikers()
        {
            MembershipUserCollection gebruikers = Membership.GetAllUsers();
            ddlGebruikers.DataSource = gebruikers;
            ddlGebruikers.DataBind();
        }

        /// <summary>
        /// Laadt de rollen in checkboxlijst
        /// </summary>
        private void laadRollen()
        {
            string[] rollen = Roles.GetAllRoles();
            GebruikersRollen.DataSource = rollen;
            GebruikersRollen.DataBind();
        }

        /// <summary>
        /// Vult de checkboxen met de rollen van de huidige gebruiker in de dropdownlist
        /// </summary>
        private void checkHuidigeGebruiker()
        {
            string huidigeGebruiker = ddlGebruikers.SelectedItem.ToString();
            string[] gebruikerRollen = Roles.GetRolesForUser(huidigeGebruiker);

            foreach (RepeaterItem item in GebruikersRollen.Items)
            {
                CheckBox cb = (CheckBox)item.FindControl("cbRol");
                if (gebruikerRollen.Contains<string>(cb.Text))
                    cb.Checked = true;
                else
                    cb.Checked = false;
            }
        }

        /// <summary>
        /// Verwijderd gebruiker bij klik op button
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnDelete_Click(object sender, EventArgs e)
        {
            if (ddlGebruikers.SelectedValue != "Admin")
            {
                int gebruikersID = beheer.getGebruikerID(ddlGebruikers.SelectedValue.ToString());
                lblDeleteResult.Text = beheer.BestaandeGebruikerVerwijderen(gebruikersID).ToString();
                Membership.DeleteUser(ddlGebruikers.SelectedValue.ToString());
                Updategebruikers();
            }
            else
                lblDeleteResult.Text = "Mislukt";
        }


        /// <summary>
        /// Wanneer een user via de membership database aangemaakt wordt, dan wordt hij ook in het entity framework 
        /// aangemaakt.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
        {
            socialeMedia = SelecteerSocialeMedia();
            lblSendResult.Text = beheer.NieuweGebruikerToevoegen(CreateUserWizard1.UserName,
                CreateUserWizard1.Email, SelecteerSocialeMedia()).ToString();
            foreach (ListItem item in cblSocialM.Items)
            {
                if (item.Selected)
                {
                    Roles.AddUserToRole(CreateUserWizard1.UserName, item.Text);
                    item.Selected = false;
                }
            }
            Roles.AddUserToRole(CreateUserWizard1.UserName, "Gebruiker");
            CreateUserWizard1.UserName = "";
            CreateUserWizard1.Email = "";
            Updategebruikers();
        }

        /// <summary>
        /// Wanneer op continue gedrukt wordt worden alle gegevens gewist uit de textvelden en gaat hij terug naar 
        /// eerste stap in de wizard
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void CreateUserWizard1_ContinueButtonClick(object sender, EventArgs e)
        {
            CreateUserWizard1.MoveTo(CreateUserWizard1.WizardSteps[0]);
        }


        /// <summary>
        /// Een mail sturen bij wachtwoord vergeten.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void PasswordRecovery1_SendingMail(object sender, MailMessageEventArgs e)
        {
            SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
            client.Host = "smtp.gmail.com";
            client.Port = 587;
            client.Credentials = new System.Net.NetworkCredential("timo.hermans@gmail.com", "spek44spek");
            client.EnableSsl = true;
            client.Send(e.Message);
            Response.Redirect("default.aspx");
        }

        /// <summary>
        /// wanneer een andere gebruiker geselecteerd wordt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void ddlGebruikers_SelectedIndexChanged(object sender, EventArgs e)
        {
            checkHuidigeGebruiker();
            checkUitgeschakeld();
        }

        /// <summary>
        /// Controleert of gebruiker is uitgeschakeld of niet.
        /// </summary>
        private void checkUitgeschakeld()
        {
            MembershipUser user = Membership.GetUser(ddlGebruikers.SelectedValue);

            if (user.IsApproved)
            {
                btnUitschakelen.Text = "Uitschakelen";
                lblGStatus.Text = "is ingeschakeld.";
            }
            else
            {
                btnUitschakelen.Text = "Inschakelen";
                lblGStatus.Text = "is uitgeschakeld.";
            }
        }

        /// <summary>
        /// verwijderd of kent autorisatie toe aan de huidige gebruiker
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void veranderRol(object sender, EventArgs e)
        {
            CheckBox cb = sender as CheckBox;
            autorisatie = new CCAutorisatie();
            string huidigeGebruiker = ddlGebruikers.SelectedValue;
            string rol = cb.Text;


            if (rol.Equals("Gebruiker"))
            {
                lblDeleteResult.Text = "Gebruiker kan niet ontnomen worden";
                cb.Checked = true;
            }
            else
            {

                if (cb.Checked)
                {
                    switch (autorisatie.AutorisatieToevoegen(huidigeGebruiker, rol))
                    {
                        case EAutorisatieToevoegen.Succes:
                            lblDeleteResult.Text = string.Format("Gebruiker {0} is toegevoegd aan rol {1}.",
                            huidigeGebruiker, rol);
                            Roles.AddUserToRole(huidigeGebruiker, rol);
                            break;
                        case EAutorisatieToevoegen.GebruikerBestaatNiet:
                            lblDeleteResult.Text = string.Format("Gebruiker {0} bestaat niet in database, neem contact op met Admin", huidigeGebruiker);
                            cb.Checked = false;
                            break;
                        case EAutorisatieToevoegen.AutorisatieBestondAl:
                            lblDeleteResult.Text = string.Format("Rol is al toegekend aan gebruiker");
                            break;
                        case EAutorisatieToevoegen.Admin:
                            lblDeleteResult.Text = "Rol toegevoegd aan admin";
                            Roles.AddUserToRole(huidigeGebruiker, rol);
                            cb.Checked = false;
                            break;
                        default:
                            break;
                    }
                }
                else
                {
                    switch (autorisatie.AutorisatieVerwijderen(huidigeGebruiker, rol))
                    {
                        case EAutorisatieVerwijderen.Succes:
                            Roles.RemoveUserFromRole(huidigeGebruiker, rol);
                            lblDeleteResult.Text = string.Format("Gebruiker {0} is verwijderd uit rol {1}.",
                           huidigeGebruiker, rol);
                            break;
                        case EAutorisatieVerwijderen.Admin:
                            lblDeleteResult.Text = string.Format("Admin kan niet gestolen worden van rollen.");
                            cb.Checked = true;
                            break;
                        case EAutorisatieVerwijderen.AutorisatieNietGevonden:
                            lblDeleteResult.Text = "Rol is niet gevonden. Vraag naar Admin";
                            cb.Checked = true;
                            break;
                        case EAutorisatieVerwijderen.GebruikerNietGevonden:
                            lblDeleteResult.Text = "Gebruiker niet gevonden in database. vraag naar Admin";
                            cb.Checked = true;
                            break;
                        default:
                            break;
                    }
                }
            }
        }


        /// <summary>
        /// knop om een gebruiker uit te schakelen, zodat hij/zij niet kan inloggen maar niet verwijderd wordt
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void btnUitschakelen_Click(object sender, EventArgs e)
        {
            MembershipUser user = Membership.GetUser(ddlGebruikers.SelectedValue);
            if (!user.ToString().Equals("Admin"))
            {
                if (user.IsApproved)
                    user.IsApproved = false;
                else
                    user.IsApproved = true;
                Membership.UpdateUser(user);
                checkUitgeschakeld();
            }
            else
            {
                lblGStatus.Text = "Admin uitschakelen?";
            }
        }

    }
}